﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
// Copyright (C) 2022 kingerrobot
// 版权所有。 
//
// 文件名：BRcsEquipCuring
// 文件功能描述：
//
// 创建者：名字 (zzl)
// 时间：2022/1/19 13:52:39
//
// 修改人：
// 时间：
// 修改说明：
// 版本：V1.0.0
//----------------------------------------------------------------*/
#endregion
namespace KingerRobot.MexicoSailunMDC.SpiService;

public class BRcsEquipCuring : IRcsEquipCuring
{

    private readonly static IWcsEquipLoc _WcsEquipLoc = new BWcsEquipLoc();
    public List<PORcsEquipCuring> GetAllEquipCurings()
    {
        var db = Db.Default;

        // 查找硫化机
        var result = db.RcsEquipCurings
            .Join(db.RcsEquips, f => f.Id, s => s.Id, (f, s) => new { Curing = f, Equip = s })
            .Where(t => t.Equip.EquipEnable == 1 && t.Equip.ErrCode == 0 && t.Curing.UseFlag == 1)
            .Select(t => t.Curing)
            .ToList();

        return result;
    }

    public List<PORcsEquipCuring> GetEquipCuringsByCode(string curingCode)
    {
        // 查找硫化机
        var db = Db.Default;
        var result = db.RcsEquipCurings
        .Join(db.RcsEquips, f => f.Id, s => s.Id, (f, s) => new { Curing = f, Equip = s })
        .Where(t => t.Equip.EquipEnable == 1 && t.Equip.ErrCode == 0 && t.Curing.UseFlag == 1 && t.Curing.CuringCode == curingCode)
        .Select(t => t.Curing)
        .ToList();

        return result;
    }

    public List<PORcsEquipCuring> GetEquipCurings()
    {
        // 查找硫化机
        var db = Db.Default;
        var result = db.RcsEquipCurings
        .Join(db.RcsEquips, f => f.Id, s => s.Id, (f, s) => new { Curing = f, Equip = s })
        .Where(t => t.Equip.EquipEnable == 1 && t.Equip.ErrCode == 0 && t.Curing.UseFlag == 1)
        .Select(t => t.Curing)
        .ToList();
        return result;
    }


    public List<PORcsEquipCuring> GetEquipCuringsByCodes(List<string> curingCodes)
    {
        // 查找硫化机
        var result = GetAllEquipCurings()
            .Where(t => curingCodes.Contains(t.CuringCode))
            .ToList();
        return result;
    }

    public PORcsEquipCuring GetCuringByCuringId(long curingId)
    {
        var db = Db.Default;

        // 查找硫化机
        var result = db.RcsEquipCurings
            .Join(db.RcsEquips, f => f.Id, s => s.Id, (f, s) => new { Curing = f, Equip = s })
            .Where(t => t.Equip.EquipEnable == 1 && t.Equip.ErrCode == 0 && t.Curing.Id == curingId && t.Equip.EquipType == 7)
            .Select(t => t.Curing)
            .FirstOrDefault();

        return result;
    }


    public PORcsEquipCuring GetAllCuringByCuringId(long curingId)
    {
        var db = Db.Default;

        // 查找硫化机
        var result = db.RcsEquipCurings
            .Join(db.RcsEquips, f => f.Id, s => s.Id, (f, s) => new { Curing = f, Equip = s })
            .Where(t => t.Curing.Id == curingId && t.Equip.EquipType == 7)
            .Select(t => t.Curing)
            .FirstOrDefault();

        return result;
    }
    public int UpdateCuringSpare(string equipCode)
    {
        var db = Db.Default;
        var result = 0;
        var sprayCount = GetCuringSpares().Where(t => t.CuringCode == equipCode).FirstOrDefault();
        if (sprayCount != null)
        {

            var equipCuringSpares = db.WcsEquipCuringSpares
            .Where(t => t.CuringCode == equipCode).FirstOrDefault();
            equipCuringSpares.SpareCurrentNum = equipCuringSpares.SpareCurrentNum + 1;
            result = db.SaveChanges();

        }

        return result;
    }

    public List<PORcsEquipCuring> GetCuringByCuringIds(List<long> curingIds)
    {
        var db = Db.Default;

        // 查找硫化机
        var result = db.RcsEquipCurings
            .Join(db.RcsEquips, f => f.Id, s => s.Id, (f, s) => new { Curing = f, Equip = s })
            .Where(t => t.Equip.EquipEnable == 1 && t.Equip.ErrCode == 0 && curingIds.Contains(t.Curing.Id.GetValueOrDefault()))
            .Select(t => t.Curing)
            .ToList();

        return result;
    }
    public List<POWcsEquipCuringSpare> GetCuringSpares()
    {
        var db = Db.Default;

        // 查找硫化机
        var result = db.WcsEquipCuringSpares.Where(t => t.UseFlag == 1).ToList();

        return result;
    }
    public PORcsEquipCuring GetCuringById(long id)
    {
        var db = Db.Default;

        // 查找硫化机
        var result = db.RcsEquipCurings.Where(t => t.Id == id).FirstOrDefault();

        return result;
    }

    public long? GetOtherHalfCuring(long targetLoc)
    {

        var curingId = _WcsEquipLoc.GetEquipIdByLocId(targetLoc);

        var curing = GetCuringByCuringId(curingId);
        if (curing == null)
        {
            return null;
        }

        var result = GetEquipCuringsByCode(curing.CuringCode).Where(t => t.Id != curingId).FirstOrDefault();
        if (result == null)
        {
            return 0;
        }

        var locId = _WcsEquipLoc.GetLocIdByEquipId(result.Id.GetValueOrDefault());
        return locId;
    }

    public (long, long) GetCuringLocByMESRL(string equipNo, int equipModel)
    {
        // 1:(1号右模；2号左模)；2:(1号左模；2号右模)
        var curings = GetEquipCuringsByCode(equipNo);
        var CuringSign = curings.FirstOrDefault()?.CuringSign;
        var curingOne = curings.Where(t => t.CuringModeIndex == 1).FirstOrDefault()?.Id ?? 0;
        var curingTwo = curings.Where(t => t.CuringModeIndex == 2).FirstOrDefault()?.Id ?? 0;

        var modelRL = GetCuringRLByMesModel(equipModel);
        var equipId = 0L;
        if (modelRL == ConstFields.CuringModeL)
        {
            // 左
            equipId = (CuringSign == 1 ? curingTwo : curingOne);
        }
        else
        {
            // 右
            equipId = (CuringSign == 1 ? curingOne : curingTwo);
        }

        var locId = _WcsEquipLoc.GetLocIdByEquipId(equipId);

        return (locId, equipId);
    }

    public (long, long) GetCuringLocByMESRLV2(string equipNo, int equipModel)
    {
        // 1:(1号右模；2号左模)；2:(1号左模；2号右模)
        var curings = GetEquipCuringsByCode(equipNo);
        var CuringSign = curings.FirstOrDefault()?.CuringSign;
        var curingOne = curings.Where(t => t.CuringModeIndex == 1).FirstOrDefault()?.Id ?? 0;
        var curingTwo = curings.Where(t => t.CuringModeIndex == 2).FirstOrDefault()?.Id ?? 0;

        var modelRL = GetCuringRLByMesModel(equipModel);
        var equipId = 0L;
        if (modelRL == ConstFields.CuringModeL)
        {
            // 左
            equipId = (CuringSign == 1 ? curingTwo : curingOne);
        }
        else
        {
            // 右
            equipId = (CuringSign == 1 ? curingOne : curingTwo);
        }

        var locId = _WcsEquipLoc.GetLocIdByEquipId(equipId);

        return (locId, equipId);
    }


    public CuringLRDTO GetCuringRLByCuringId(long curingId)
    {
        var curing = GetCuringByCuringId(curingId);

        // 设备是否停止【停止(已有请料输送至异常口)】
        return GetCuringRLReault(curing);
    }

    public CuringLRDTO GetCuringRLByCuringLocId(long curingLocId)
    {
        var curingId = _WcsEquipLoc.GetEquipIdByLocId(curingLocId);

        // 设备是否停止【停止(已有请料输送至异常口)】
        return GetCuringRLByCuringId(curingId);
    }
    public CuringLRDTO GetCuringRLReault(PORcsEquipCuring curing)
    {
        // 设备是否停止【停止(已有请料输送至异常口)】
        if (curing is null || curing.CuringStatus == 2)
        {
            return null;
        }

        string mode;
        // 1:(1号右模；2号左模)；2:(1号左模；2号右模)
        if (curing.CuringSign == 1)
        {
            //TODO 左右模 定义为Const常量
            mode = curing.CuringModeIndex == 1 ? ConstFields.CuringModeR : ConstFields.CuringModeL;
        }
        else
        {
            mode = curing.CuringModeIndex == 1 ? ConstFields.CuringModeL : ConstFields.CuringModeR;
        }
        return new()
        {
            CuringId = curing.Id.GetValueOrDefault(),
            CuringCode = curing.CuringCode,
            Mode = mode,
            ModeIndex = curing.CuringModeIndex.GetValueOrDefault(),
        };
    }
    public string GetCuringRLByMesModel(int equipModel)
    {
        return equipModel == 1 ? ConstFields.CuringModeR : ConstFields.CuringModeL;
    }
    public int GetCuringRLByMesModelRL(string equipModelRL)
    {
        return ConstFields.CuringModeR.Equals(equipModelRL) ? 1 : 2;
    }

    public bool IsPairCuring(long targetLoc, long otherTargetLoc)
    {
        var db = Db.Default;
        var equips = db.WcsEquipLocs.Where(t => t.LocId == targetLoc || t.LocId == otherTargetLoc).Select(t => t.EquipId).ToList();
        if (equips.Count() != 2)
        {
            return false;
        }
        var targetEqu = equips[0];
        var otherTargetEqu = equips[1];
        var result = db.RcsEquipCurings
            .Where(t => t.Id == targetEqu || t.Id == otherTargetEqu)
            .Select(t => t.CuringCode).ToList();
        if (result.Count == 2 && result.Distinct().Count() == 1)
        {
            return true;
        }
        return false;
    }

    public int UpdateCuringCallNo(long id, int CallNo)
    {
        var db = Db.Default;
        var result = db.RcsEquipCurings.Where(t => t.Id == id).Update(new PORcsEquipCuring
        {
            CuringCallNo = CallNo,
            UpdateTime = DateTime.Now,
        });

        return db.SaveChanges();
    }
    public int UpdateCuringCallTime(long id)
    {
        var db = Db.Default;
        DateTime currTime = DateTime.Now;
        var result = db.RcsEquipCurings.Where(t => t.Id == id).Update(new PORcsEquipCuring
        {
            LastCuringCallTime = currTime
        });

        return db.SaveChanges();
    }

    public int UpdateCuringCallRemark(long id, string Remark)
    {
        var db = Db.Default;
        var result = db.RcsEquipCurings.Where(t => t.Id == id).Update(new PORcsEquipCuring
        {
            Remark = Remark
        });

        return db.SaveChanges();
    }

}